#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Encoder_Interface.h"
#include "TIM.h"
int16_t rotation_per_second;

int16_t rotationCount;

uint16_t encoder_overflow_count;

int16_t rpm;

int main(void)
{
	/*模块初始化*/
	OLED_Init();		//OLED初始化
	
	
	init_encoder_interface();
    
    init_tim();
    
    OLED_ShowString(1,1,"RPM:");
    OLED_ShowString(2,1,"overflow count:");
	while (1)
	{
        
        OLED_ShowSignedNum(1,5,rpm,8);
        //OLED_ShowSignedNum(2,1,rotation_per_second,8);
        //OLED_ShowSignedNum(3,1,TIM_GetCounter(TIM3)/24,8);
        Delay_s(1);
        OLED_ShowNum(3,1,encoder_overflow_count,5);
	}
}

void TIM3_IRQHandler(void){

      if(TIM_GetITStatus(TIM3,TIM_IT_Update)){
    
        // 编码器计数溢出
          encoder_overflow_count++;
        
        TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
    }
}

void TIM2_IRQHandler(void){

    if(TIM_GetITStatus(TIM2,TIM_IT_Update)){
    
//      利用补码的特性，可以很容易的把 计数器中的 0-65535 
        //      转换为  -32768 - 32767 之间
//          正数代表正转
//          负数代表反转        
        int16_t  count = TIM_GetCounter(TIM3);
        // 旋转了多少圈
        // 因为经过配置的 proteus 中 encoder-motor 每转一圈包含 360 个脉冲
        // 所以除以360就能代表转了多少圈
        
        // 又因为这里 对于编码器A相的上升沿、下降沿和B相的上升沿、下降沿
        // 四个边沿都进行计数
        // 所以要把边沿数转换为脉冲数 
        // 所以要除以4
        
        /*
        rps rotation per second 每秒转速
         = 转过的圈数/ 所经过的时间
        
        因为所经过的时间为 0.01秒
        为了避免精度丢失，这里不用除以0.01 
        而是乘以 100
        
        rpm 为每分钟转多少圈
        rpm = 60 * rps
        */
        
        // 计算过程参考：https://cloud.tencent.com/developer/article/1794018
        // M法测速 
        rpm = 60* 100 * count / 360/4;
        
        //encoder_overflow_count=0;
        
        TIM_SetCounter(TIM3,0);
        
        // 每秒转多少圈
        rotation_per_second = rotationCount;//*1000;
        
        
        TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
    }

}
